#include <dretve.h>
#include <ispis.h>
#include <vrijeme.h>

static int mon, red;

static void tdretva(void *x)
{
	int i, id = id_dretve();
	vrijeme_t koliko;
	koliko.sekunde = 1;
	koliko.nsekunde = 0;
	
	ispisi("Dretva %d pocetak\n", id);

#define NN 3
	zakljucaj(mon);
	for (i = 0; i < NN; i++) {
		ispisi("Dretva %d, prije prolaza = %d\n", id, i + 1);
		//propusti(red);
		cekaj_u_redu(red, mon);
		ispisi("Dretva %d, poslije prolaza = %d\n", id, i + 1);
	}
	otkljucaj(mon);
#undef NN

	ispisi("Dretva %d zavrsava\n", id);
}

void test_sinkro()
{
	ispisi("\n[%s:%s:%d]\n", __FILE__, __FUNCTION__, __LINE__);

	int dr1, dr2, i;
	vrijeme_t koliko;
	koliko.sekunde = 1;
	koliko.nsekunde = 0;
	
	mon = dohvati_sinkro(MONITOR, 0, REKURZ | NASPRIO, 0);
	if (mon == -1) {
		ispisi("nema monitora!\n");
		return;
	}

	//test rekurzivnog zakljucavanja
#define NN 2
	for (i = 0; i < NN; i++) {
		ispisi("Glavna dretva zakljucava (%d/%d)\n", i + 1, NN);
		zakljucaj(mon);
	}
	for (i = 0; i < NN; i++) {
		ispisi("Glavna dretva otkljucava (%d/%d)\n", i + 1, NN);
		otkljucaj(mon);
	}
#undef NN

	red = dohvati_sinkro(REDUVJETA, 0, 0, 0);
	if (red == -1) {
		ispisi("nema reda uvjeta!\n");
		return;
	}
	
	dr1 = stvori_dretvu(tdretva, NULL);
	dr2 = stvori_dretvu(tdretva, NULL);
	if (dr1 == -1 || dr2 == -1)
		return;

#define NN 10
	for (i = 0; i < NN; i++) {
		ispisi("Glavna dretva (%d/%d)\n", i + 1, NN);
		spavaj(koliko);
		propusti_iz_reda(red);
	}
#undef NN
	
	cekaj_kraj_dretve(dr1);
	ispisi("Docekana prva!\n");
	cekaj_kraj_dretve(dr2);
	ispisi("Docekana druga!\n");
	
	obrisi_sinkro(red);
	obrisi_sinkro(mon);
}
